import socket
import binascii

# 构建报文函数
def build_message():
    # 定义字段数据
    length_string = "256"  # 电文长度
    tele_no = 'SIDS03'  # 电文号
    defect = '16'  # 缺陷
    coil_no = 'a123sa' #钢卷号
    fault_state = 'hhh' #故障
    straight_deviation = '12' #跑偏量

    # 转换数据为字节流
    length_bytes = length_string.ljust(4, ' ').encode('ascii')  # 电文长度填充空格，确保4字节
    tele_no_bytes = tele_no.ljust(6, ' ').encode('ascii')  # 电文号填充空格，确保6字节
    defect_bytes = defect.ljust(2, ' ').encode('ascii')  # 缺陷填充空格，确保2字节
    coil_no_bytes = coil_no.ljust(16, ' ').encode('ascii')
    fault_state_bytes = fault_state.ljust(100, ' ').encode('ascii')
    straight_deviation_bytes = straight_deviation.ljust(10, ' ').encode('ascii')
    
    # 拼接所有字段为最终报文
    message1 = (length_bytes + tele_no_bytes + fault_state_bytes)
    message2 = (length_bytes + tele_no_bytes + coil_no_bytes + defect_bytes)
    message3 = (length_bytes + tele_no_bytes + coil_no_bytes + straight_deviation_bytes)

    # 确保报文长度为 256 字节，不足时填充空格
    message = message3.ljust(256, b' ')  # 其他部分填充空格，确保总长度为256字节
    # 打印报文的十六进制表示
    print(f"Sent (Hex): {binascii.hexlify(message).decode('ascii')}")
    return message


# 发送报文
def send_message():
    # 创建 TCP socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('127.0.0.1', 5001))  # 连接到服务器（IP: 127.0.0.1, Port: 5001）

    # 构建报文
    message = build_message()

    # 转换报文为十六进制
    hex_message = convert_to_hex(message)
    print(f"Hexadecimal Message: {hex_message}")

    # 发送报文（发送字节流）
    s.sendall(message)  # 这里发送的是字节流，不是十六进制字符串
    print(f"Sent (in bytes): {message}")

    # 接收响应
    data = s.recv(1024)
    print(f"Received: {data.decode('utf-8')}")

    # 关闭连接
    s.close()

# 执行发送报文
#send_message()

build_message()